#!/usr/bin/python3
# -*- coding: utf-8 -*-

# Author: Yuwenhai

# 说明
# 1.';' '#' '//' 之后的内容均视为无效内容,不会参与匹配
# 2.自动匹配两个16进制数字,数字间可以用任意非16进制字符以外的内容分割
# 3.带16进制前缀和不带前缀均可,前缀和16进制中的字符大小写均可

# 注意
# 1.OV的配置一般会包括前面的iic地址,需要手动删除再使用本工具,可以正则的方式把"^6a "替换成""
# 2.SONY的配置一般是Excel,把寄存器和值复制到文本里就行

import re

INPUT = r"xxx.txt"  # 输入文件名
regAddrType = 2
regDataType = 1


def format_reg(hex_numbers):
    return f'''
        <regSetting>
          <registerAddr>0x{hex_numbers[0]:04X}</registerAddr>
          <registerData>0x{hex_numbers[1]:02X}</registerData>
          <regAddrType range="[1,4]">{regAddrType}</regAddrType>
          <regDataType range="[1,4]">{regDataType}</regDataType>
          <operation>WRITE</operation>
          <delayUs>0x00</delayUs>
        </regSetting>'''

def extract_hex_numbers(line):
    # 使用正则表达式来匹配16进制数字，可以包含0x前缀或不包含
    hex_numbers = re.findall(
        r'0X[0-9A-Fa-f]{2,4}|0x[0-9A-Fa-f]{2,4}|[0-9A-Fa-f]{2,4}', line)

    # 如果找到了两个以上的数字，返回前两个（忽略其他的）
    if len(hex_numbers) >= 2:
        res = [int(hex_numbers[0],16),int(hex_numbers[1],16)]
        if res[1] > 0xff and regDataType == 1:
            print(f"\033[91mERROR: 寄存器值大于0xFF,请检查这行:[{line}],同时检查数据类型设置[regDataType:{regDataType}]\033[0m")
            return None
        return res
    else:
        return None


def remove_comments_and_extract(input_line):
    # 删除"#"、";"或"//"以及它们后面的字段
    line = re.sub(r'#.*', '', input_line)
    line = re.sub(r';.*', '', line)
    line = re.sub(r'//.*', '', line)
    line = re.sub(r'；.*', '', line)
    return line.strip()


def main(input_file, output_file):
    with open(input_file, 'r') as f_input, open(output_file, 'w') as f_output:
        for line in f_input:
            # 删除注释和后续字段，然后提取16进制数字
            cleaned_line = remove_comments_and_extract(line)
            if cleaned_line:
                hex_numbers = extract_hex_numbers(cleaned_line)
                if hex_numbers:
                    # 格式化输出
                    format_text = format_reg(hex_numbers)
                    f_output.write(f"{format_text}")


if __name__ == "__main__":
    input_file = INPUT
    output_file = input_file + '.out'  # 输出文件名
    print(f"输入文件:[{input_file}]")
    main(input_file, output_file)
    print(f"输出文件:[{output_file}]")
